package br.com.veterinariavillage.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import br.com.veterinariavillage.model.Animal;
import br.com.veterinariavillage.model.Cliente;
import br.com.veterinariavillage.model.Especie;

public class DAOAnimal implements IDAOAnimal {
	
	Connection conexao = GenericDao.getConnection();
	
	@Override
	public void inserir(Animal a) {
		try{
			PreparedStatement ps = conexao.prepareStatement(" insert into Animal(nome, idade, descricao, cod_especie, cod_cliente) " +
															" values (?,?,?,?,?)");
			ps.setString(1, a.getNome());
			ps.setInt(2, a.getIdade());
			ps.setString(3, a.getDescricao());
			ps.setInt(4, a.getEspecie().getCodigo());
			ps.setInt(5, a.getCliente().getCodigo());
			ps.execute();
			ps.close();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void atualizar(Animal a) {
		try{
			PreparedStatement ps = conexao.prepareStatement(" update Animal set nome = ?, idade = ?, descricao = ? " +
															" cod_especie = ?, cod_cliente = ? " +
															" where cod_animal = ?");
			ps.setString(1, a.getNome());
			ps.setInt(2, a.getIdade());
			ps.setString(3, a.getDescricao());
			ps.setInt(4, a.getEspecie().getCodigo());
			ps.setInt(5, a.getCliente().getCodigo());
			ps.setInt(6, a.getCodigo());
			ps.execute();
			ps.close();
		} catch(Exception e){
			e.printStackTrace();
		}
	}

	@Override
	public void excluir(Animal a) {
		try{
			PreparedStatement ps = conexao.prepareStatement("delete Animal where cod_animal = ?");
			ps.setInt(1,a.getCodigo());
			ps.execute();
			ps.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	@Override
	public ArrayList<Animal> localizar() {
		ArrayList<Animal> listaAnimal = new ArrayList<Animal>();
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexao.prepareStatement(" select cod_animal, nome, idade, descricao, cod_especie, cod_cliente " +
															" from Animal");
			ps.execute();
			rs = ps.getResultSet();
			while (rs.next()){
				Animal animal = new Animal();
				animal.setCodigo(rs.getInt("codigo"));
				animal.setNome(rs.getString("nome"));
				animal.setIdade(rs.getInt("idade"));
				animal.setDescricao(rs.getString("descricao"));
				int codEspecie = rs.getInt("cod_especie");
				int codCliente = rs.getInt("cod_cliente");
				animal = localizaDependencias(animal, codEspecie, codCliente);
				listaAnimal.add(animal);
			}
			ps.close();
		}catch (Exception e){
			e.printStackTrace();
		}
		return listaAnimal;
	}

	@Override
	public ArrayList<Animal> localizar(String nome) {
		ArrayList<Animal> listaAnimal = new ArrayList<Animal>();
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexao.prepareStatement(" select cod_animal, nome, idade, descricao, cod_especie, cod_cliente " +
															" from Animal where UPPER(nome) like UPPER(?+'%')");
			ps.setString(1, nome);
			ps.execute();
			rs = ps.getResultSet();
			while (rs.next()){
				Animal animal = new Animal();
				animal.setCodigo(rs.getInt("cod_animal"));
				animal.setNome(rs.getString("nome"));
				animal.setIdade(rs.getInt("idade"));
				animal.setDescricao(rs.getString("descricao"));
				int codEspecie = rs.getInt("cod_especie");
				int codCliente = rs.getInt("cod_cliente");
				animal = localizaDependencias(animal, codEspecie, codCliente);
				listaAnimal.add(animal);
			}
			ps.close();
		}catch (Exception e){
			e.printStackTrace();
		}
		return listaAnimal;
	}

	@Override
	public Animal localizar(int codigo) {
		// TODO Auto-generated method stub
		return null;
	}

	private Animal localizaDependencias(Animal animal, int codEspecie, int codCliente){
		IDAOEspecie daoEspecie = new DAOEspecie();
		IDAOCliente daoCliente = new DAOCliente();

		Especie especieAnimal = daoEspecie.localizar(codEspecie);
		Cliente clienteAnimal = daoCliente.localizar(codCliente);
		animal.setEspecie(especieAnimal);
		animal.setCliente(clienteAnimal);
		
		return animal;		
	}
	
}
